const fs = require('fs').promises;
const path = require('path');



/**
 * 处理commonList v0.0.2版本模板类型代码生成
 * @param {Object} data - 前端传来的数据
 * @param {Object} templateConfig - 模板配置参数
 * @param {string} targetDir - 目标目录
 * @param {string} hooksDir - hooks目录
 * @param {Object} res - Express响应对象
 */
async function processCommonListLongnows(data, templateConfig, targetDir, hooksDir, res) {
  const { queryFields, listFields, vueFileName } = templateConfig;
  
  // 渲染 useForms.ejs 模板
  const formsContent = await new Promise((resolve, reject) => {
    res.render('commonList/hooks/useForms.ejs', {
      queryFields: queryFields,
      listFields: listFields
    }, (err, html) => {
      if (err) {
        console.error('Error rendering useForms.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });
  
  // 渲染 useTables.ejs 模板
  const tablesContent = await new Promise((resolve, reject) => {
    res.render('commonList/hooks/useTables.ejs', {
      queryFields: queryFields,
      listFields: listFields
    }, (err, html) => {
      if (err) {
        console.error('Error rendering useTables.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });

   // 渲染 引入useListOperation.ts 模板
   const listOperationContent =  await new Promise((resolve, reject) => {
    res.render('commonList/hooks/useListOperation.ejs', {}, (err, html) => {
      if (err) {
        console.error('Error rendering useListOperation.ts:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });

   })
  
  // 写入文件
  await fs.writeFile(path.join(hooksDir, 'useForms.ts'), formsContent);
  await fs.writeFile(path.join(hooksDir, 'useTables.ts'), tablesContent);
  await fs.writeFile(path.join(hooksDir, 'useListOperation.ts'), listOperationContent);
  
  // 复制其他固定文件
  const originalHooksDir = path.join(__dirname, '../../codeTemplate/commonList/hooks');
  const filesToCopy = ['index.ts', 'useActionFun.ts'];
  
  for (const file of filesToCopy) {
    const sourcePath = path.join(originalHooksDir, file);
    const destPath = path.join(hooksDir, file);
    await fs.copyFile(sourcePath, destPath);
  }
  
  // 处理Vue文件
  const pageCode = data.pageCode || '';
  await processVueFile('commonList',  vueFileName, pageCode, targetDir);
}

/**
 * 处理commonList模板类型代码生成主函数
 * @param {Object} data - 前端传来的数据
 * @param {Object} templateConfig - 模板配置参数
 * @param {string} targetDir - 目标目录
 * @param {string} hooksDir - hooks目录
 * @param {Object} res - Express响应对象
 */
async function processCommonListTemplate(data, templateConfig, targetDir, hooksDir, res) {
  // 根据版本选择处理方法
  const handler = processCommonListLongnows;
  if (handler) {
    await handler(data, templateConfig, targetDir, hooksDir, res);
  } else {
    throw new Error(`Unsupported commonList`);
  }
}

/**
 * 处理Vue文件
 * @param {string} templateType - 模板类型
 * @param {string} vueFileName - Vue文件名
 * @param {string} pageCode - 页面代码
 * @param {string} targetDir - 目标目录
 * @param {Object} res - Express响应对象
 */
async function processVueFile(templateType,  vueFileName, pageCode, targetDir, res) {
  const vueSourcePath = path.join(__dirname, `../../codeTemplate/${templateType}/${vueFileName}`);
  const vueDestPath = path.join(targetDir, vueFileName);
  const ejsSourcePath = path.join(__dirname, `../../codeTemplate/${templateType}/${vueFileName.replace('.vue', '.ejs')}`);
  
  if (pageCode) {
    // 如果传入了pageCode，则使用EJS渲染模板
    try {
      const vueContent = await new Promise((resolve, reject) => {
        res.render(`${templateType}/${vueFileName.replace('.vue', '')}`, {
          pageCode: pageCode
        }, (err, html) => {
          if (err) {
            console.error(`Error rendering ${vueFileName}:`, err);
            reject(err);
          } else {
            resolve(html);
          }
        });
      });
      await fs.writeFile(vueDestPath, vueContent);
    } catch (error) {
      // 如果使用EJS渲染失败，尝试使用旧的方法
      try {
        // 首先检查是否存在.vue文件
        try {
          await fs.access(vueSourcePath);
          // 如果.vue文件存在，则使用原来的逻辑
          let vueContent = await fs.readFile(vueSourcePath, 'utf8');
          // 替换标记为实际的pageCode
          vueContent = vueContent.replace(/<!--\s*{{pageCode}}\s*-->/g, pageCode);
          // 同时替换 const pageCode = "<%= pageCode %>" 这样的字符串
          vueContent = vueContent.replace(/const pageCode = ["']<%= pageCode %>["']/g, `const pageCode = '${pageCode}'`);
          await fs.writeFile(vueDestPath, vueContent);
        } catch (vueFileError) {
          // 如果.vue文件不存在，尝试使用.ejs文件
          try {
            await fs.access(ejsSourcePath);
            let vueContent = await fs.readFile(ejsSourcePath, 'utf8');
            // 替换标记为实际的pageCode
            vueContent = vueContent.replace(/<%= pageCode %>/g, pageCode);
            await fs.writeFile(vueDestPath, vueContent);
          } catch (ejsFileError) {
            throw new Error(`Neither ${vueFileName} nor ${vueFileName.replace('.vue', '.ejs')} template file found`);
          }
        }
      } catch (error2) {
        console.error(`Error processing ${vueFileName}:`, error2);
        throw error2;
      }
    }
  } else {
    // 如果没有传入pageCode，则直接复制文件
    try {
      await fs.access(vueSourcePath);
      await fs.copyFile(vueSourcePath, vueDestPath);
    } catch (vueFileError) {
      // 如果.vue文件不存在，尝试复制.ejs文件并重命名为.vue
      try {
        await fs.access(ejsSourcePath);
        let vueContent = await fs.readFile(ejsSourcePath, 'utf8');
        await fs.writeFile(vueDestPath, vueContent);
      } catch (ejsFileError) {
        throw new Error(`Neither ${vueFileName} nor ${vueFileName.replace('.vue', '.ejs')} template file found`);
      }
    }
  }
}

module.exports = {
  processCommonListTemplate
};